#include "pch.h"
#include "DatabaseUrlProvider.hpp"




DatabaseUrlProvider::DatabaseUrlProvider(db::Connection::Ptr connection, db::TableDL::const_Ptr table)
	: m_connection(connection)
	, m_table(table)
	, m_batchSize(1000)
	, m_lastId(0)
{
	verify(m_connection->isOpen());
	verify(m_table->exists(connection));
}
///////////////////////////////////////////////////////////////////////////////////////////////////

DatabaseUrlProvider::~DatabaseUrlProvider()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////




boost::optional<QUrl> DatabaseUrlProvider::next()
{
	if(m_readCache.size() == 0)
	{
		QSqlQuery query = m_connection->prepare(QString("SELECT id, url FROM %1 WHERE id >= :id LIMIT 0, :limit").arg(m_table->dbName()));
		query.bindValue(":id", m_lastId);
		query.bindValue(":limit", m_batchSize);

		if(!query.exec())
			// TODO: Note the error
			return boost::optional<QUrl>();

		while(query.next())
		{
			QVariant     variant;
			QUrl         url;

			variant = query.value(0);
			if(!variant.canConvert(QVariant::ULongLong))
				// TODO: Note the error
				continue;
			m_lastId = variant.toULongLong();

			variant = query.value(1);
			if(!variant.canConvert(QVariant::String))
				// TODO: Note the error
				continue;

			url = variant.toString();
			if(!url.isValid())
				// TODO: Note the error
				continue;

			m_readCache << url;
		}
	}

	if(m_readCache.size())
	{
		QUrl url = m_readCache.front();
		m_readCache.pop_front();
		return url;
	}
	else
	{
		return boost::optional<QUrl>();
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void DatabaseUrlProvider::insert(QUrl url)
{
	QSqlQuery query = m_connection->prepare(QString("INSERT INTO %1 (url) VALUES (:url)").arg(m_table->dbName()));
	query.bindValue(":url", url.toString());
	if(!query.exec())
		// TODO: Log this
		return;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
